/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.tri.model;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import org.tri.entity.Transaccion;

/**
 *
 * @author giaco
 */
public class TransaccionTableModel extends AbstractTableModel{
    
    /** Filas (objetos) de la tabla. */
    private List<Transaccion> filas;
    /** Aliases para las propiedades (headers de las columnas). */
    private String[] columnas;

    /**
     * Inicializa el modelo a partir de una clase de entidad, mostrando las propiedades
     * seleccionadas de la lista de entidades.
     * @param filas filas (objetos) del modelo. 
     * @param columnas aliases para las propiedades a mostrar.
     */
    public TransaccionTableModel( List<Transaccion> filas ) {
        super();

        //seteamos los aliases para las columnas
        columnas = new String[] { "Fecha" , "Tipo de Movimiento" , "Nro Comprobante" , "Establecimiento" , "Cantidad de Animales" };
        
        //cargamos los objetos en la lista
        if ( filas != null )
            this.filas = filas;
        else
            this.filas = new ArrayList( 0 );

    }//end constructor

    /**
     * Inicializa el modelo a partir de una clase de entidad, las propiedades
     * a mostrar y sus aliases, pero sin ningúna fila.
     * @param clase clase de la entidad a modelar.
     * @param columnas aliases de las propiedades a mostrar.
     * @param propiedades propiedades de la clase de entidad que se mostraran en cada
     * columna.
     */
    public TransaccionTableModel() {
        this( null );

    }//end constructor

    /**
     * Cambia las filas (objetos) del modelo por un nuevo conjunto.
     * @param filas nuevas filas del modelo.
     */
    public void setFilas( List<Transaccion> filas ) {
        if ( filas != null )
            this.filas = filas;
        else
            this.filas = new ArrayList( 0 );

        fireTableDataChanged();

    }//end método setFilas
    
    /**
     * Devuelve las filas del modelo.
     * @return filas del modelo.
     */
    public List<Transaccion> getFilas() {
        return filas;
        
    }//end método getFilas
    
    /**
     * Agrega un elemento al modelo.
     * @param fila elemento a agregar.
     */
    public void agregarFila( Transaccion fila ) {
        if ( !filas.contains( fila ) )
            filas.add( fila );
        
        fireTableDataChanged();
        
    }//end método agregarFila
    
    /**
     * Quita un elemento del modelo.
     * @param fila elemento a quitar.
     */
    public void quitarFila( Transaccion fila ) {
        filas.remove( fila );
        
        fireTableDataChanged();
        
    }//end método quitarFila

    /**
     * Devuelve el nombre de la columna representada por el indice 
     * pasado por parámetros.
     * @param column posición (indice) de la columna.
     * @return nombre de la columna indicada.
     */
    @Override
    public String getColumnName( int column ) {
        return columnas[column];

    }//end método getColumnName

    /**
     * Devuelve la cantidad de filas del modelo.
     * @return cantidad de filas del modelo.
     */
    @Override
    public int getRowCount() {
        return filas.size();

    }//end método getRowCount

    /**
     * Devuelve la cantidad de columnas del modelo.
     * @return cantidad de columnas del modelo.
     */
    @Override
    public int getColumnCount() {
        return columnas.length;

    }//end método getColumnCount

    /**
     * Devuelve el valor de una celda identificada por su fila y columna.
     * @param rowIndex indice de la fila.
     * @param columnIndex índice de la columna.
     * @return valor de la propiedad correspondiente a la columna indicada
     * del objeto correspondiente a la fila indicada.
     */
    @Override
    public Object getValueAt( int rowIndex, int columnIndex ) {
        Object value;

        //dependiendo la columna devuelve el valor
        switch( columnIndex ){
            case 0:
                   SimpleDateFormat formato = new SimpleDateFormat("dd-MM-yyyy");
                   value = formato.format(filas.get(rowIndex).obtenerFecha());
                   break;
            case 1:
                   value = filas.get(rowIndex).obtenerTipoMovimiento();
                   break;
            case 2:
                   value = filas.get(rowIndex).obtenerNroComprobante();
                   break;
            case 3:
                   value = filas.get(rowIndex).obtenerEstablecimiento();
                   break;
            case 4:
                   value = filas.get(rowIndex).obtenerCantidadAnimales();
                   break;
            default: value = "-";
        }
        
        if(value.equals('\0') || value.equals( 0 ))
            value = "-";
        
        return value;

    }//end método getValueAt

    /**
     * Devuelve el objeto que representa una fila del modelo.
     * @param nroFila número de la fila de la cual se desea obtener el objeto.
     * @return objeto de la fila seleccionada o null si dicho objeto no existe.
     */
    public Transaccion getFila( int nroFila ) {
        Transaccion fila = null;

        if ( nroFila >= 0 && nroFila < filas.size() )
            fila = filas.get( nroFila );

        return fila;

    }//end método getFila

    /**
     * Asigna una lista vacia de filas para limpiar el modelo.
     */
    public void limpiar() {
        this.filas = new ArrayList( 0 );

        fireTableDataChanged();

    }//end método limpiar

}
